home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / FH-3DTUT.ZIP / TUT3X.PAS < prev    next >
Pascal/Delphi Source File  |  1996-01-01  |  5KB  |  152 lines

  1. program Tutorial3x; {to get the basics take a look at TUT1.PAS and TUT2.PAS}
  2. {AnyObject Rotation Interactive eXtended
  3.  Made by fh94.3 (C) 1/1/1996
  4.  Mail: fh@viktoria.drp.fmph.uniba.sk
  5.  
  6.  Based on explanation by Synergist (rhr0982@grace.rit.edu).
  7. }
  8. uses tutunit,crt;
  9.  
  10. const sin005 : real = 0.049979169;
  11.       cos005 : real = 0.99875026;
  12. var xt,yt,zt:real; {temp points}
  13.     ch:char; {for key you want to press}
  14.     xan,yan,zan:real; {angles for axis X,Y,Z}
  15.     objname: string[20]; {just a junk}
  16.     sx,sy,sx1,sy1,p,zoom,p1: integer; {Screen coords X,Y}
  17.     points,lines:word; {nr. of points and lines of the object}
  18.     obj,objold: array[0..511] of real; {object to rotate (max 512 points}
  19.     lobj: array[0..1023] of integer; {line index of object (max 1024}
  20.     xsin,ysin,zsin,xcos,ycos,zcos: real; {some help variables}
  21.     {eeh, sorry if i don't use all of them, no time for optimization}
  22.  
  23. procedure intro;
  24. begin
  25. textcolor(15);
  26. writeln('3d Rotation v0.3 (interactive)');
  27. writeln('Made by fh94.3 (C) 1/1/1996.');
  28. writeln;
  29. writeln(' Name of object: ',objname);
  30. writeln(' Nr. of points:  ',points);
  31. writeln(' Nr. of lines:   ',lines);
  32. textcolor(7);
  33. writeln;
  34. writeln(' Keyz: x     - rotates around X axis,');
  35. writeln('       y     - rotates around Y axis,');
  36. writeln('       z     - rotates around Z axis,');
  37. writeln('       UP    - moves the object up,');
  38. writeln('       DOWN  - moves the object down,');
  39. writeln('       LEFT  - moves the object left,');
  40. writeln('       RIGHT - moves the object right,');
  41. writeln('       +     - moves the object to the front,');
  42. writeln('       -     - moves the object to the back,');
  43. writeln('       [     - increases the size of the object,');
  44. writeln('       ]     - decreases the size of the object,');
  45. writeln('       r     - resets the values.');
  46. writeln;
  47. writeln('Press a key to continue ...');
  48. readkey;
  49. end;
  50.  
  51. procedure readdata;
  52. var f:text;
  53. begin
  54. if ParamCount <> 1 then begin writeln('Usage: TUT3 datafile'); halt(0); end;
  55. assign(F,Paramstr(1));
  56. reset(F);
  57. readln(F,objname);
  58. readln(F,points,lines);
  59. p1:=0;
  60. for p:=1 to points do begin readln(F,obj[p1],obj[p1+1],obj[p1+2]); p1:=p1+3; end;
  61. p1:=0;
  62. for p:=1 to lines do begin readln(F,lobj[p1],lobj[p1+1]); p1:=p1+2; end;
  63. close(F);
  64. end;
  65.  
  66. procedure draw(color:byte); {procedure to draw a cube}
  67. begin
  68.  for p:=0 to lines-1 do begin {loops for all lines}
  69.   sx:=round(zoom*obj[lobj[p*2]*3])+160; {x coord for point1}
  70.   sy:=round(zoom*obj[lobj[p*2]*3+1])+100; {y coord for point1}
  71.   sx1:=round(zoom*obj[lobj[p*2+1]*3])+160; {x coord for point2}
  72.   sy1:=round(zoom*obj[lobj[p*2+1]*3+1])+100; {y coord for point2}
  73.   drawline(SX,SY,sx1,sy1,color); {draw line between points 1&2 in current color}
  74.  end;
  75. end;
  76.  
  77. procedure calc; {calculates new values after rotate step}
  78. begin
  79. for p:=0 to points-1 do begin {repeats for all points}
  80. Yt := obj[p*3+1] * xCOS - obj[p*3+2] * xsin; {read old values from the table of coord,}
  81. Zt := obj[p*3+1] * xsin + obj[p*3+2] * xcos; {rotating about x axis}
  82. obj[p*3+1] := Yt; {writes the new values back to the table}
  83. obj[p*3+2] := Zt;
  84.  
  85. Xt := obj[p*3] * ycos - obj[p*3+2] * ySIN; {same as above, for Y axis}
  86. Zt := obj[p*3] * ySIN + obj[p*3+2] * yCOS;
  87. obj[p*3] := Xt;
  88. obj[p*3+2] := Zt;
  89.  
  90. Xt := obj[p*3] * zCOS - obj[p*3+1] * zSIN; {about Z axis}
  91. Yt := obj[p*3] * zSIN + obj[p*3+1] * zCOS;
  92. obj[p*3] := Xt;
  93. obj[p*3+1] := Yt;
  94. end;
  95. end;
  96.  
  97. procedure move(xp,yp,zp:real);
  98. begin
  99. for p:=0 to points-1 do begin {repeats for all points}
  100. obj[p*3]:=obj[p*3]+xp; {add xp to the X coord (even if it is less then 0)}
  101. obj[p*3+1]:=obj[p*3+1]+yp; {add yp to the Y coord}
  102. obj[p*3+2]:=obj[p*3+2]+zp; {...i think you've got the idea}
  103. end;
  104. end;
  105.  
  106. begin
  107. readdata;
  108. intro;
  109. Mcgaon;       {sets the 13h (320x200x256) mode}
  110. zoom:=30;     {size of the object}
  111.  
  112. clearscreen;
  113. draw(15);
  114. repeat        {loops ...}
  115.  ch:=readkey;
  116.  draw(0);
  117.   xsin:=0; {'cause sin(0)=0}
  118.   ysin:=0; {...}
  119.   zsin:=0; {...}
  120.   xcos:=1; {'cause cos(0)=1}
  121.   ycos:=1; {...}
  122.   zcos:=1; {...}
  123.   case ch of
  124.    'X' : begin xsin:=sin005; {rotates around X}
  125.      xcos:=cos005; end;  
  126.    'Y' : begin ysin:=sin005; {...}
  127.      ycos:=cos005; end;
  128.    'Z' : begin zsin:=sin005;
  129.      zcos:=cos005; end;
  130.    'x' : begin xsin:=sin005; {for small caps, too}
  131.      xcos:=cos005; end;
  132.    'y' : begin ysin:=sin005; {...}
  133.      ycos:=cos005; end;
  134.    'z' : begin zsin:=sin005;
  135.      zcos:=cos005; end;
  136.    '[' : zoom:=zoom+5;       {bigger}
  137.    ']' : zoom:=zoom-5;       {smaller}
  138.    #77 : move(0.1,0,0);      {move right}
  139.    #72 : move(0,-0.1,0);     {move up}
  140.    #75 : move(-0.1,0,0);     {move left}
  141.    #80 : move(0,0.1,0);      {move down}
  142.    '+' : begin; move(0,0,-0.1); zoom:=zoom+5; end; {move to front} {or no?}
  143.    '-' : begin; move(0,0,0.1); zoom:=zoom-5; end;  {move to back}
  144.    'r' : readdata;           {resets the values}
  145.    'R' : readdata;           { '  ' }
  146.   end;
  147. calc;         {calculates the new coords}
  148. draw(15);     {draws it again}
  149. delay(30);    {wait a sec!}
  150. until ch=#27; {... 'till you press ESC}
  151. mcgaoff;      {jump back to text mode}
  152. end.